package com.sz.biz.trade.bill.service;

import com.sz.biz.trade.bill.entity.TrdBilling;
import com.sz.biz.trade.bill.dto.TrdBillingGenerateDto;
import com.sz.biz.trade.bill.dto.TrdBillingTaskQueryDto;
import com.sz.common.base.dto.CommonModel;
import com.sz.common.base.dto.QResultDto;
import com.sz.common.base.dto.QueryParams;
import com.sz.biz.logistics.bill.entity.BillingStatus;
import com.sz.biz.logistics.bill.dto.BillingUrlDto;

import java.util.List;
import java.util.Map;

/**
 * Function: 账单服务 <br>
 * Author: changwentao <br>
 * Date: 2017-07-18 14:09:00
 */

public interface TrdBillingService {

    /**
     * 生成账单
     *
     * @param trdBillingTaskQueryDto trdBillingTaskQueryDto
     */
    void generateBill(TrdBillingTaskQueryDto trdBillingTaskQueryDto);

    /**
     * 账单列表
     *
     * @param params params
     * @return QResultDto
     */
    QResultDto findByFilter(QueryParams params);

    /**
     * 账单列表-客户平台
     *
     * @param billNo          billNo
     * @param orderNo         orderNo
     * @param cusUserId      cusUserId
     * @param status          status
     * @param includeAllAudit includeAllAudit
     * @param startEffectTime startEffectTime
     * @param endEffectTime   endEffectTime
     * @param pageIndex       pageIndex
     * @param pageSize        pageSize
     * @param sort            sort
     * @param asc             asc
     * @return
     */
    QResultDto findByFilterForCustomer(Integer platformId,String billNo, String orderNo, Integer cusUserId,
                                       BillingStatus status,
                                       boolean includeAllAudit, String startEffectTime, String endEffectTime,
                                       int pageIndex, int pageSize, String sort, Boolean asc);

    /**
     * 批量删除账单信息
     *
     * @param billingNos
     */
    void batchdeleteByNos(List<String> billingNos);

    /**
     * 批量删除账单信息-客户平台
     * 只能删除已付款的账单
     *
     * @param billingNos
     */
    void batchdeleteByNosCustomer(List<String> billingNos);

    /**
     * 提交审核
     *
     * @param billNos
     */
    void submit(List<String> billNos);

    /**
     * 审核账单
     *
     * @param map
     */
    BillingStatus audit(Map<String, Object> map);

    /**
     * 价格调整
     *
     * @param billingDto
     */
    void adjustment(Map<String, String> billingDto);

    /**
     * 所有账单状态
     *
     * @param isAudit
     * @return
     */
    List<CommonModel> getBillingStatus(String isAudit);

    /**
     * 所有账单状态-客户平台
     *
     * @return
     */
    List<CommonModel> getBillingStatusForCustomer();

    /**
     * 根据账单号获取账单信息
     *
     * @param billNo billNo
     * @return Billing
     */
    TrdBilling findByBillNo(String billNo);

    /**
     * 所有的价格调整类型
     *
     * @return List
     */
    List<CommonModel> getAdjustmentType();

    /**
     * 重新生成账单
     *
     * @param trdBillingTaskQueryDto        trdBillingTaskQueryDto
     */
    void regenerate(TrdBillingTaskQueryDto trdBillingTaskQueryDto);

    /**
     * 根据任务编码删除账单
     *
     * @param taskCodes taskCodes
     */
    void batchDeleteByTaskCodes(List<String> taskCodes);

    /**
     * 已付款
     *
     * @param billNos billNos
     */
    void paid(List<String> billNos);

    /**
     * 导出账单
     *
     * @param billNos billNos
     */
    List<BillingUrlDto> export(List<String> billNos);

    /**
     * 导出账单-客户平台
     *
     * @param billNos billNos
     */
    List<BillingUrlDto> exportCustomer(List<String> billNos);

    /**
     * 获取时间段内所有订单信息
     *
     * @param trdBillingTaskQueryDto trdBillingTaskQueryDto
     * @param isBilled       isBilled
     * @return List
     */
    List<TrdBillingGenerateDto> getOrderByBizCompanyIdAndCreateTime(TrdBillingTaskQueryDto trdBillingTaskQueryDto, boolean isBilled);

    /**
     * 客户平台账单流转，已出帐，已付款，逾期未结
     *
     * @param billNo billNo
     * @return List
     */
    List<Map<String, String>> findFinancialApprovals(String billNo);
}
